/**
 * 
 * 广州锐鹏计算机科技有限公司（www.ruipengkj.com）
 * 
 * 
 * Copyright (c) 2011-2012 RUIPENGKJ.Co.Ltd. All rights reserved.
 * 
 * */
package com.ruipengkj.commons.util.print;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.standard.PrinterName;
import javax.swing.JOptionPane;

import com.ruipengkj.ApplicationContext;
import com.ruipengkj.bean.TCommodity;
import com.ruipengkj.bean.TExePos;
import com.ruipengkj.bean.TOrder;
import com.ruipengkj.commons.util.DateFormatUtil;
import com.ruipengkj.commons.util.UUID;
import com.ruipengkj.commons.util.Util;
/**
 * 说明：
 * 会员消费小票打印
 * @Author：李智深
 * @Date：2012-05-11
 */
public class TicketPrint extends Thread implements Printable {
	
	private List<TCommodity> commodityList;
	private TOrder order;
	private String printName;
	private TExePos tExePos;
	
	private boolean isMember = false;
	
	public TicketPrint(TExePos tExePos, TOrder order,List<TCommodity> commodityList,String printName, boolean isMember){
		this.commodityList=commodityList;
		this.order=order;
		this.printName=printName;
		this.isMember = isMember;
		this.tExePos = tExePos;
	}
	
	/**
	 * * @param Graphic指明打印的图形环境 * @param
	 * PageFormat指明打印页格式（页面大小以点为计量单位，1点为1英寸的1/72，1英寸为25.4毫米。A4纸大致为595×842点） * @param
	 * pageIndex指明页号
	 **/
	@Override
	public int print(Graphics gra, PageFormat pf, int pageIndex)
			throws PrinterException {
		String str ="";
		if(ApplicationContext.SHOP_INFO!=null){
//			str = ApplicationContext.SHOP_INFO.getName()+"结账单";
			str = "尊敬的先生/女士，欢迎光临"+ApplicationContext.SHOP_INFO.getName();
		}else{
			str = "请先设置商店信息";
		}
		String strPos = "结账单";
		if (tExePos != null) {
			strPos = tExePos.getName() + strPos;
		}
		
		Graphics2D g2 = (Graphics2D) gra;
		g2.setColor(Color.BLACK);
		// 打印起点坐标
		double x = pf.getImageableX()+2;
		double y = pf.getImageableY();
		switch (pageIndex) {
		case 0:
			g2.setFont(Util.TICKETFONT3); // 设置字体
			float[] dash1 = { 2.0f };
			g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));
			FontMetrics fm=g2.getFontMetrics(Util.TICKETFONT);
			double width=pf.getWidth();
			int lineHeihth=10;
//			g2.drawString(str, (float) width/2-fm.stringWidth(str)/2, (float) y + 8); // 第一排
			g2.drawString(str, 0, (float) y + 8); // 第一排
			
			g2.drawString(strPos, (float)width-fm.stringWidth(strPos)-48, (float) y + 18); // 第2排"
			
			g2.drawLine((int) x, (int) lineHeihth*2+5,(int) width, (int) lineHeihth*2+5);//第三排(线条)
			g2.drawString("工号"+ApplicationContext.EMPLOYEE_SN, (int)x, lineHeihth*3+5);//第四排（编号）
			g2.drawString("单号"+order.getOrderID(), (int)width-fm.stringWidth("单号"+order.getOrderID())-48, lineHeihth*3+5);//第五排（开台）
			
			//订单项目
			g2.drawString("品名", (int)x, lineHeihth*4+5);//第八排（订单头部）
			g2.drawString("数量", (int)width-fm.stringWidth("单价")-fm.stringWidth("数量")-80, lineHeihth*4+5);//第八排（订单头部）
			g2.drawString("单价", (int)width-fm.stringWidth("金额")-fm.stringWidth("单价：")-24, lineHeihth*4+5);//第八排（订单头部）
			g2.drawString("金额", (int)width-fm.stringWidth("金额")-10, lineHeihth*4+5);//第八排（订单头部）
			
			g2.drawLine((int) x, (int) lineHeihth*5,(int) width, (int) lineHeihth*5);//第七排(线条)
			int number=7;
			for(int i=0;i<commodityList.size();i++){
				TCommodity commodity=commodityList.get(i);
				g2.drawString(commodity.getName()+(commodity.getUnit()!=null ? "/"+commodity.getUnit():""), (int)x, lineHeihth*(number-1));//名称
//				g2.drawString(commodity.getBarcode(), (int)x, lineHeihth*number);//条码 
				g2.drawString(commodity.getNum()+"", (int)width-fm.stringWidth("单价")-fm.stringWidth("数量")-73, lineHeihth*(number-1));//数量
				g2.drawString(commodity.getDiscountPrice()+"", (int)width-fm.stringWidth("金额")-fm.stringWidth("单价：")-24, lineHeihth*(number-1));//单价
				g2.drawString(commodity.getDiscountPrice()*commodity.getNum()+"", (int)width-fm.stringWidth(commodity.getDiscountPrice()*commodity.getNum()+"")-10, lineHeihth*(number-1));//总额
				number++;
//				number++;
			}
			number--;
			g2.drawLine((int) x, (int) lineHeihth*number,(int) width, (int) lineHeihth*number);//第九排(线条)
			
			g2.drawString("种数"+commodityList.size(), (int)x, (int) lineHeihth*(number+1)+5);//第四排（编号）
			g2.drawString("件数"+this.getTotalNumber(), (float) width/2-fm.stringWidth("件数"+this.getTotalNumber())/2-16, (int) lineHeihth*(number+1)+5);//第四排（位置）
			g2.drawString("应收"+order.getNeedMoney(), (float)width-fm.stringWidth("应收"+order.getNeedMoney())-30, (int) lineHeihth*(number+1)+5);//第五排（开台）
			if (isMember) {
				g2.drawString("店连卡支付", (int)x, (int) lineHeihth*(number+2)+5);//第四排（编号）
			} else {
				g2.drawString("现金"+ApplicationContext.CHANGE_CASH, (int)x, (int) lineHeihth*(number+2)+5);//第四排（编号）
				g2.drawString("找回"+ApplicationContext.CHANGE_MANEY, (float) width/2-fm.stringWidth("找回"+ApplicationContext.CHANGE_MANEY)/2-15, (int) lineHeihth*(number+2)+5);//第四排（位置）
			}
			g2.drawString("总金额"+order.getTotalAmount(), (float)width-fm.stringWidth("总金额"+order.getTotalAmount())-33, (int) lineHeihth*(number+2)+5);//第五排（开台）
//			g2.setFont(Util.TICKETFONT2); // 设置字体
			g2.drawString("谢谢惠顾", (int)x, lineHeihth*(number+3)+5);//第六排（人数）
			g2.drawString("请保留好您的小票", (int)x, lineHeihth*(number+4)+5);//第六排（人数）
			if(ApplicationContext.SHOP_INFO!=null){
				g2.drawString(DateFormatUtil.formatJ(new Date()), (int)x, lineHeihth*(number+6));//第六排（人数）
				g2.drawString("电话："+ApplicationContext.SHOP_INFO.getPhone(), (int)x, lineHeihth*(number+7));//第六排（人数）
			}else{
				g2.drawString(DateFormatUtil.formatJ(new Date()), (int)x, lineHeihth*(number+6));//第六排（人数）
				g2.drawString("电话：请先设置商店信息", (int)x, lineHeihth*(number+7));//第六排（人数）
			}
			return PAGE_EXISTS;
		default:
			return NO_SUCH_PAGE;
		}
	}

	public void receiptsPrint() {
		Book book = new Book();
		
		PageFormat pf = new PageFormat();
		pf.setOrientation(PageFormat.PORTRAIT); // LANDSCAPE表示竖打;PORTRAIT表示横打;REVERSE_LANDSCAPE表示打印空白
		Paper p = new Paper();
		p.setSize(164,220+commodityList.size()*12); // 纸张大小(590, 840)表示A4纸
		p.setImageableArea(0, 0, 164, 220+commodityList.size()*12-14); // A4(595 X
		pf.setPaper(p);
		book.append(this, pf);
		PrinterJob job = PrinterJob.getPrinterJob();
		job.setPageable(book);
		
		HashAttributeSet hs = new HashAttributeSet();
		hs.add(new PrinterName(printName, null));
		PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);
		if (pss.length == 0) {
			JOptionPane.showMessageDialog(null, "无法找到打印机:" + printName);
			return;
		}
		try {

			// 可以用printDialog显示打印对话框，在用户确认后打印；也可以直接打印
			job.setPrintService(pss[0]);
			job.print();
		} catch (PrinterException e) {
			JOptionPane.showMessageDialog(null, "请确定已经开启打印服务！");
			 e.printStackTrace();
		}
	}
	//统计总金额
//	public double getTotalManay(){
//		double totalManay=0.0;
//		for(int i=0;i<commodityList.size();i++){
//			TCommodity tCommodity=commodityList.get(i);
//			totalManay=totalManay+(tCommodity.getPrice()*tCommodity.getNum());
//		}
//		return totalManay;
//	}
	//统计数量
	public int getTotalNumber(){
		int totalNumber=0;
		for(int i=0;i<commodityList.size();i++){
			TCommodity tCommodity=commodityList.get(i);
			totalNumber=totalNumber+tCommodity.getNum();
		}
		return totalNumber;
	}
	public void run(){
		receiptsPrint();
	}
	
	public static void main(String[] args) {
		List<TCommodity> commodityList=new ArrayList<TCommodity>();
		for(int i=0;i<10;i++){
			TCommodity oi = new TCommodity();
			oi.setName("红烧茄子焖鸡饭");
			oi.setNum(2);
			oi.setDiscountPrice(12.9);
			oi.setBarcode("123456789123456");
			oi.setUnit("斤");
			commodityList.add(oi);
		}
		
		new TicketPrint(null, getTOrder(),commodityList,"T58N", true).start();
	}
	
	private static TOrder getTOrder(){
		TOrder order=new TOrder();
		order.setOrderID(UUID.GenUUID15());//定单编号CHAR(15)PK
		//支付方式
		order.setPayWay((byte)1);
		order.setStatus(ApplicationContext.ORDER_STATUS07);//TINYINT定单状态1为开始创建的定单 2为确认定单 3为已确定支付方式 4为定单已分配（确认货源） 5为定单正在执行调度 6为定单已发货 7为定单已完成 该字节的10位为撤消标记 0为没有撤消，1为正在撤消
		order.setPayStatus(ApplicationContext.PLAY_STATUS_YES);//支付状态 1为未支付 2为已支付 
		order.setSendWay(ApplicationContext.ORDER_SENDWAY_MODT1);//配送方式  1为送货上门 2为物流
		order.setEndWay(ApplicationContext.ORDER_ENDWAY_MODT1);//结束方式0为未设置 1为成功完成 2为已合并 3为已取消 4为卖家已取消 5为卖家无法送抵（比如说买家不要了）
		order.setTotalAmount(2000);//总金额DECIMAL(20,3)
		order.setNeedMoney(1000);//应支付金额
		order.setPayedAmount(1000);//已支付金额
		order.setDiscountAmount(1000);//优惠金额
		order.setPayID("999999999");//支付单编号 CHAR(15)
		order.setOrderType(ApplicationContext.ORDERTYPE1);//定单类型 TINYINT 1为个人定单 21为企业定单（个人支付） 22为企业定单（企业支付） 3为楼宇定餐定单，当类型为3时，群组编号为定单生成时的位置编号
		order.setCommentStatus(ApplicationContext.COMMENNTSTATUS1);//评价状态 十位为1商店是否已评价，0为未评价 个位为1商品是否已评价，0为未评价
		order.setCancelReason("");//取消原因 VARCHAR(256)
		order.setNote("");//定单备注 VARCHAR(512)
		order.setSource((byte)1);//订单来源CHAR(15)
		order.setType(ApplicationContext.ORDER_TYPE1+"");//订单类型CHAR(18)1为零售 2为批发
		order.setSaler("");//销售人CHAR(15)
		order.setOperator(ApplicationContext.OPERATOR_ID);//操作人CHAR(15)
		order.setBillType(ApplicationContext.BILLTYPE1);//票据类型TINYINT 1为收据  2为发票
		order.setInvoice("");//发票号VARCHAR(30)
		order.setCardPayedAmount(0);//会员卡支持金额DECIMAL(20,3)
//		order.setSendInfo(null);//配送地址编号CHAR(15)
		return order;
	}
}
